package com.kaithan.framework.common.excel;

import cn.idev.excel.context.AnalysisContext;
import cn.idev.excel.event.AnalysisEventListener;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.extern.slf4j.Slf4j;

import java.util.ArrayList;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;

/**
 * 类描述：动态表头的excel数据读取监听器
 *
 * @author ZhuYin
 * @since 2024年06月20日
 */
@Getter
@Slf4j
@NoArgsConstructor
@AllArgsConstructor
public class DynamicHeaderExcelListener extends AnalysisEventListener<Map<Integer, String>> {

    /**
     * 表头名称集合
     */
    private List<String> headerNameList = new ArrayList<>();

    /**
     * 读取到的excel数据，包括表头行(从第1行开始)以及数据行(从第2行开始)，包括空行，每一列末尾追加了当前行号列
     */
    private List<LinkedHashMap<Integer, String>> dataList = new ArrayList<>();

    @Override
    public void invokeHeadMap(Map<Integer, String> headMap, AnalysisContext context) {
        // 这里可以处理表头信息
        headerNameList.clear();
        headerNameList.addAll(headMap.values());
    }

    /**
     * 方法说明：当读取到一行数据时调用此方法
     *
     * @param object     行数据
     * @param context    上下文
     * @author ZhuYin
     * @since 2024年06月20日
     */
    @Override
    public void invoke(Map<Integer, String> object, AnalysisContext context) {
        // 将数据添加到列表中，即使它是空的
        LinkedHashMap<Integer, String> row = (LinkedHashMap<Integer, String>) object;
        // 获取当前行号
        int currentRowNum = context.readRowHolder().getRowIndex() + 1;
        // 把读取到的当前行号信息放到行尾列
        row.put(row.size(), currentRowNum + "");
        dataList.add(row);
    }

    /**
     * 方法说明：所有数据读取完成后调用此方法
     *
     * @param context 上下文
     * @author ZhuYin
     * @since 2024年06月20日
     */
    @Override
    public void doAfterAllAnalysed(AnalysisContext context) {
        // 这里可以处理整个列表数据
        log.info("Excel total rows read: {}", dataList.size());
    }

}
